home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
Updates
/
Hardware
/
DCF77update
/
diskarchiv.lha
/
DCF77
/
Developer
/
WaitDCF77ifCrash.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-08-01
|
4KB
|
169 lines
/* WaitDCF77ifCrash ***RGR***
Author: Ralf Gruner, An der Sense 5a, D-02779 Großschönau, Germany.
*/
#include <exec/types.h>
#include <exec/semaphores.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <stdio.h>
BPTR DateFile =NULL;
char *filename1 ="ENVARC:LastBootDate";
BPTR CONWin =NULL;
char *filename2 ="CON:20/20/280/80/WaitDCF77ifCrash/AUTO";
char *version="$VER: WaitDCF77ifCrash 1.5 (27.7.98)";
struct StateList
{
struct SignalSemaphore sl_Semaphore;
STRPTR Version;
BOOL Received; // hier können andere Tasks nachschauen, ob die Systemzeit gestellt ist.
LONG ReceiverState; // 0 - kein Signal. 1 -Empfang gestört.
// 2 - Warte auf Synchronisation. 3 - Empfang läuft.
// 4 - Programm inaktiv
LONG TimeLeft; // voraussichtl. Dauer [s] bis zum nächsten Stellen der Zeit
LONG LastError;
};
#define RCVSTATE_NOSIGNAL 0
#define RCVSTATE_BADSIGNAL 1
#define RCVSTATE_WAITFORSYNC 2
#define RCVSTATE_RECEIVING 3
#define RCVSTATE_INACTIVE 4
struct StateList *DCF77PublicState=NULL, CopyOfState;
UBYTE * DCF77SemaphoreName = "DCF77 State";
BOOL DCF77received=FALSE;
main(int argc, char *argv[])
{
struct DateStamp DS, DSfromFile;
long bytes;
LONG DCFVersion=0, DCFRevision=0, Characters;
char *msg1="";
char *msg2= " © 1994-1998 Ralf Gruner, Großschönau, Germany.\n\n"
" WaitDCF77ifCrash waits for received time from DCF77\n if the date of your hardware clock has been corrupted.\n"
" Usage: Place it in a script above your date sensitive application.\n\n";
if(argc != 1)
{
puts(msg1);
puts(version+5);
puts(msg2);
}
else
{
DateStamp((struct DateStamp *)&DS); // Systemzeit in Struktur eintragen
if (NULL!=(DateFile = Open(filename1,MODE_OLDFILE)))
{
bytes = Read(DateFile,&DSfromFile,(LONG)sizeof(struct DateStamp));
Close(DateFile);
if (bytes != (LONG)sizeof(struct DateStamp))
{
DSfromFile.ds_Days=0;
}
}
else
DSfromFile.ds_Days=0;
if(DSfromFile.ds_Days > DS.ds_Days || DSfromFile.ds_Days < DS.ds_Days-182)
{
Delay(500L); // ggf. auf Workbench-Window warten
CONWin = Open(filename2,MODE_NEWFILE);
while(!DCF77received)
{
Forbid();
if(DCF77PublicState=(struct StateList *) FindSemaphore(DCF77SemaphoreName))
{
ObtainSemaphoreShared((struct SignalSemaphore *) DCF77PublicState);
DCF77received=DCF77PublicState->Received;
Characters=StrToLong(DCF77PublicState->Version,&DCFVersion);
StrToLong(DCF77PublicState->Version+Characters+1,&DCFRevision);
if(DCFVersion>2 || DCFVersion==2 && DCFRevision>=18)
{
CopyOfState=*DCF77PublicState;
}
else
{
CopyOfState.ReceiverState=-2; // alte DCF77-Version
}
ReleaseSemaphore((struct SignalSemaphore *) DCF77PublicState);
}
else
{
DCF77received=FALSE; // DCF77 läuft nicht
CopyOfState.ReceiverState=-1;
}
Permit();
if(CONWin)
{
FPrintf(CONWin,"\2330 p\2330;0H\n\n Waiting for DCF77...\n\n\233K");
if(!DCF77received)
{
switch(CopyOfState.ReceiverState)
{
case -1:
FPrintf(CONWin," DCF77 is not running.\n");
break;
case RCVSTATE_NOSIGNAL:
FPrintf(CONWin," No signal.\n");
break;
case RCVSTATE_BADSIGNAL:
FPrintf(CONWin," Bad signal.\n");
break;
case RCVSTATE_WAITFORSYNC:
FPrintf(CONWin," Waiting for synchronisation.\n");
break;
case RCVSTATE_RECEIVING:
FPrintf(CONWin," Receiving. %3ld left.\n",CopyOfState.TimeLeft);
break;
case RCVSTATE_INACTIVE:
FPrintf(CONWin," Inactive.\n");
break;
}
}
}
if(!DCF77received)
Delay(100L); // zwei Sekunden warten und dann erneut testen
}
DateStamp((struct DateStamp *)&DS); // neue Systemzeit in Struktur eintragen
if(CONWin)
{
FPrintf(CONWin," Time is okay now.\n");
Delay(150L);
Close(CONWin);
}
}
if(DSfromFile.ds_Days != DS.ds_Days)
{
// nur speichern, wenn Tag geändert
if (NULL!=(DateFile = Open(filename1,MODE_NEWFILE)))
{
bytes = Write(DateFile,&DS,(LONG)sizeof(struct DateStamp));
if (bytes != (LONG)sizeof(struct DateStamp))
{
puts("Error while writing");
}
Close(DateFile);
}
}
}
}